home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / SourceCode / AdobeExamples / NX_Binary / FormatApp.m < prev    next >
Text File  |  1992-12-19  |  7KB  |  300 lines

  1.  
  2. /*
  3.  * (a)  (C) 1990 by Adobe Systems Incorporated. All rights reserved.
  4.  *
  5.  * (b)  If this Sample Code is distributed as part of the Display PostScript
  6.  *    System Software Development Kit from Adobe Systems Incorporated,
  7.  *    then this copy is designated as Development Software and its use is
  8.  *    subject to the terms of the License Agreement attached to such Kit.
  9.  *
  10.  * (c)  If this Sample Code is distributed independently, then the following
  11.  *    terms apply:
  12.  *
  13.  * (d)  This file may be freely copied and redistributed as long as:
  14.  *    1) Parts (a), (d), (e) and (f) continue to be included in the file,
  15.  *    2) If the file has been modified in any way, a notice of such
  16.  *      modification is conspicuously indicated.
  17.  *
  18.  * (e)  PostScript, Display PostScript, and Adobe are registered trademarks of
  19.  *    Adobe Systems Incorporated.
  20.  * 
  21.  * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
  22.  *    CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
  23.  *    AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
  24.  *    ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
  25.  *    OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
  26.  *    WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
  27.  *    WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
  28.  *    DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, 
  29.  *    FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
  30.  *    OF THIRD PARTY RIGHTS.
  31.  */
  32.  
  33. /*
  34. *    FormatApp.m
  35. *
  36. *    This subclass of the application class performs the global
  37. *    setup needed for the FormatExporter application. The drawing
  38. *    window is created.
  39.  *
  40.  *    Version:    2.0
  41.  *    Author:    Ken Fromm
  42.  *    History:
  43.  *            03-07-91        Added this comments.
  44. */
  45.  
  46. #import "FormatApp.h"
  47. #import "DocView.h"
  48. #import "DrawingView.h"
  49. #import "DrawingViewWraps.h"
  50. #import "EpsfParser.h"
  51. #import <objc/hashtable.h>        /* for NXCopyStringBuffer() */
  52. #import <appkit/Button.h>
  53. #import <appkit/Matrix.h>
  54. #import <appkit/OpenPanel.h>
  55. #import <appkit/ScrollView.h>
  56. #import <appkit/Window.h>
  57. #import <appkit/nextstd.h>
  58. #import <sys/param.h>
  59. #import <string.h>
  60.  
  61. static NXRect            windowRect = {150, 184, 550, 600};
  62.  
  63. @implementation FormatApp
  64.  
  65. /*
  66. *    Allocate the memory for the user path description buffers. Create the
  67. *    window for drawing the image.
  68. */
  69. + new
  70. {
  71.     self = [super new];
  72.  
  73.     NX_MALLOC(drawBuffer.pts, float, PTS_UPATH_BUFFER);
  74.     NX_MALLOC(drawBuffer.ops, char, OPS_UPATH_BUFFER);
  75.  
  76.     readerId = [EpsfParser  new];
  77.  
  78.     [self  createWindow:&windowRect];
  79.  
  80.     return self;
  81. }
  82.  
  83. /*
  84. *    Create the drawing window and place a scrollview as the content view.
  85. *    A DrawingView instance is placed as the DocView of the ScrollView.
  86. */
  87. - createWindow:(NXRect *) winRect
  88. {
  89.     NXRect    tempRect;
  90.  
  91.     windowId = [Window newContent:winRect
  92.             style:NX_TITLEDSTYLE
  93.             backing:NX_RETAINED
  94.             buttonMask:NX_RESIZEBUTTONMASK
  95.             defer:NO];
  96.  
  97.     [Window  getContentRect:&tempRect  forFrameRect:winRect  style:NX_TITLEDSTYLE];
  98.     scrollviewId = [ScrollView newFrame:&tempRect];
  99.     [scrollviewId setBorderType:SCROLLVIEW_BORDER];
  100.  
  101.     drawingviewId = [DrawingView  newFrame:&tempRect];
  102.     docviewId = [[[DocView new]  setClipping:NO] setScale:1.0];
  103.     [scrollviewId  setDocView:docviewId];
  104.     [[docviewId  superview]  setFlipped:NO];
  105.     [docviewId  addDrawView:drawingviewId];
  106.  
  107.     [[windowId setContentView:scrollviewId] free];
  108.  
  109.     [windowId makeFirstResponder:drawingviewId];
  110.     [windowId setDelegate:self];
  111.     [windowId display];
  112.  
  113.     return self;
  114. }
  115.  
  116. /* The window will free the its subviews. */
  117. - free
  118. {
  119.     if (drawBuffer.pts)
  120.         NX_FREE(drawBuffer.pts);
  121.     if (drawBuffer.ops)
  122.         NX_FREE(drawBuffer.ops);
  123.  
  124.     [readerId  free];
  125.     [windowId  free];
  126.  
  127.     return [super free];
  128. }
  129.  
  130. - formatMatrix;
  131. {
  132.     return formatmatrixId;
  133. }
  134.  
  135. - setFormatMatrix:anObject;
  136. {
  137.     formatmatrixId = anObject;
  138.  
  139.     return self;
  140. }
  141.  
  142. - showWindow:sender
  143. {
  144.     if (currentfile)
  145.         [windowId makeKeyAndOrderFront:self];
  146.     
  147.     return self;
  148. }
  149.  
  150. - getDrawingView
  151. {
  152.     return drawingviewId;
  153. }
  154.  
  155. - getDocument
  156. {
  157.     return docviewId;
  158. }
  159.  
  160. - (UPath *) getUpathBuffer
  161. {
  162.     return &drawBuffer;
  163. }
  164.  
  165. - save:sender
  166. {
  167.     return [drawingviewId  saveFile:sender];
  168. }
  169.  
  170. /*
  171.  * Called by pressing Load... in the Main menu.
  172.  */
  173. - load:sender
  174. {
  175.     id                openpanelId, tempviewId;
  176.  
  177.     const char        *file;
  178.  
  179.     static const char *const        doctype[3] = {"ps", "eps", NULL};
  180.    
  181.        NXStream        *stream;
  182.  
  183.      NXPoint            viewPt, windowPt;
  184.  
  185.      NXRect            epsfBounds, viewFrame;
  186.  
  187.     openpanelId = [[OpenPanel new] allowMultipleFiles:NO];
  188.  
  189.     if ([openpanelId runModalForTypes:doctype])
  190.     {
  191.         file = [openpanelId filename];
  192.         if (!currentfile || strcmp(file, currentfile))
  193.         {
  194.             stream = NXMapFile(file, NX_READONLY);
  195.             if (stream)
  196.             {
  197.                 tempviewId = [View new];
  198.                 [windowId  setContentView:tempviewId];
  199.                 [self setName:file withParsing:YES];
  200.                 [windowId display];
  201.                 [windowId makeKeyAndOrderFront:self];
  202.                 [[windowId  setContentView:scrollviewId]  free];
  203.  
  204.                 if ([readerId  readPSFromStream:stream])
  205.                 {
  206.                     [docviewId  scaleView:drawingviewId  withScale:1.0];
  207.                     [docviewId  setScale:1.0];
  208.  
  209.                     [readerId  getBounds:&epsfBounds];
  210.                     [drawingviewId  setDrawOrigin:&epsfBounds.origin];
  211.                     [drawingviewId  sizeTo:epsfBounds.size.width  :epsfBounds.size.height];
  212.  
  213.                     [self setName:file withParsing:NO];
  214.                     if (currentfile)
  215.                         NX_FREE(currentfile);
  216.                     currentfile = NXCopyStringBuffer(file);
  217.  
  218.                     [windowId disableDisplay];
  219.                         [docviewId  placeView:drawingviewId];
  220.  
  221.                         /* Scroll center of image to center of window. */
  222.                         [docviewId  getFrame:&viewFrame];
  223.                         viewPt.x = viewFrame.size.width/2;
  224.                         viewPt.y = viewFrame.size.height/2;
  225.                         [drawingviewId  convertPoint:&viewPt
  226.                                 fromView:docviewId];
  227.  
  228.                         [scrollviewId  getFrame:&viewFrame];
  229.                         windowPt.x = viewFrame.size.width/2;
  230.                         windowPt.y = viewFrame.size.height/2;
  231.                         [scrollviewId  convertPoint:&windowPt  toView:nil];
  232.  
  233.                         [docviewId  scrollPoint:&viewPt 
  234.                                 inView:drawingviewId  to:&windowPt];
  235.                     [windowId reenableDisplay];
  236.                     [windowId display];
  237.                 }
  238.                 else
  239.                     [self setName:currentfile withParsing:NO];
  240.     
  241.                 NXCloseMemory(stream, NX_FREEBUFFER);
  242.             }
  243.             else
  244.                 NXRunAlertPanel("Load File", "Invalid File.  Cannot open.", 
  245.                     "OK", NULL, NULL);
  246.         }
  247.     }
  248.  
  249.     return self;
  250. }
  251.  
  252. /*
  253.  * Updates the name and directory of the document.
  254.  */
  255. - setName:(const char *)filename withParsing:(BOOL) flag
  256. {
  257.     int        len = 0;
  258.  
  259.     char        title[MAXPATHLEN+5];
  260.     
  261.     char        *simple_filename;
  262.  
  263.     if (filename && *filename)
  264.     {
  265.         if (flag)
  266.             strcpy(title, "parsing:");
  267.         else
  268.             title[0] = 0;
  269.  
  270.         simple_filename = strrchr(filename, '/');
  271.         if (simple_filename)
  272.         {
  273.             len = strlen(simple_filename);
  274.             simple_filename++;
  275.             strcat(title, simple_filename);
  276.             strcat(title, " \320 ");            /* \320 is a "long dash" */
  277.             strcatn(title, filename, strlen(filename) - len);
  278.         }
  279.         else
  280.             strcat(title, filename);    
  281.  
  282.         [windowId setTitle:title];
  283.     }
  284.  
  285.     return self;
  286. }
  287.  
  288. /*
  289.  * Resizes the doc view and repositions the drawing view inside the doc view.
  290.  */
  291. - windowDidResize:sender
  292. {
  293.     [docviewId  placeView:drawingviewId];
  294.  
  295.     return self;
  296. }
  297.  
  298. @end
  299.  
  300.